/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ugc.cnel.manabi.jpa;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import org.ugc.cnel.manabi.entidades.Agencia;
import org.ugc.cnel.manabi.entidades.Inspeccion;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Vector;
import org.ugc.cnel.manabi.jpa.exceptions.IllegalOrphanException;
import org.ugc.cnel.manabi.jpa.exceptions.NonexistentEntityException;
import org.ugc.cnel.manabi.jpa.exceptions.PreexistingEntityException;

/**
 *
 * @author Admin
 */
public class AgenciaJpaController {

    public AgenciaJpaController() {
        emf = Persistence.createEntityManagerFactory("SICOPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    /**
     * Metodo obsoleto por integracion SICO
     * @param agencia
     * @throws PreexistingEntityException
     * @throws Exception
     * @deprecated
     */
    @Deprecated
    public void create(Agencia agencia) throws PreexistingEntityException, Exception {
        if (agencia.getInspeccionCollection() == null) {
            agencia.setInspeccionCollection(new ArrayList<Inspeccion>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Collection<Inspeccion> attachedInspeccionCollection = new ArrayList<Inspeccion>();
            for (Inspeccion inspeccionCollectionInspeccionToAttach : agencia.getInspeccionCollection()) {
                inspeccionCollectionInspeccionToAttach = em.getReference(inspeccionCollectionInspeccionToAttach.getClass(), inspeccionCollectionInspeccionToAttach.getId());
                attachedInspeccionCollection.add(inspeccionCollectionInspeccionToAttach);
            }
            agencia.setInspeccionCollection(attachedInspeccionCollection);
            em.persist(agencia);
//            for (Inspeccion inspeccionCollectionInspeccion : agencia.getInspeccionCollection()) {
//                Agencia oldIdAgenciaOfInspeccionCollectionInspeccion = inspeccionCollectionInspeccion.getIdAgencia();
//                inspeccionCollectionInspeccion.setIdAgencia(agencia);
//                inspeccionCollectionInspeccion = em.merge(inspeccionCollectionInspeccion);
//                if (oldIdAgenciaOfInspeccionCollectionInspeccion != null) {
//                    oldIdAgenciaOfInspeccionCollectionInspeccion.getInspeccionCollection().remove(inspeccionCollectionInspeccion);
//                    oldIdAgenciaOfInspeccionCollectionInspeccion = em.merge(oldIdAgenciaOfInspeccionCollectionInspeccion);
//                }
//            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findAgencia(agencia.getId()) != null) {
                throw new PreexistingEntityException("Agencia " + agencia + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /**
     * Metodo obsoleto por integracion SICO
     * @param agencia
     * @throws PreexistingEntityException
     * @throws Exception
     * @deprecated
     */
    @Deprecated
    public void edit(Agencia agencia) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Agencia persistentAgencia = em.find(Agencia.class, agencia.getId());
            Collection<Inspeccion> inspeccionCollectionOld = persistentAgencia.getInspeccionCollection();
            Collection<Inspeccion> inspeccionCollectionNew = agencia.getInspeccionCollection();
            List<String> illegalOrphanMessages = null;
            for (Inspeccion inspeccionCollectionOldInspeccion : inspeccionCollectionOld) {
                if (!inspeccionCollectionNew.contains(inspeccionCollectionOldInspeccion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Inspeccion " + inspeccionCollectionOldInspeccion + " since its idAgencia field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Collection<Inspeccion> attachedInspeccionCollectionNew = new ArrayList<Inspeccion>();
            for (Inspeccion inspeccionCollectionNewInspeccionToAttach : inspeccionCollectionNew) {
                inspeccionCollectionNewInspeccionToAttach = em.getReference(inspeccionCollectionNewInspeccionToAttach.getClass(), inspeccionCollectionNewInspeccionToAttach.getId());
                attachedInspeccionCollectionNew.add(inspeccionCollectionNewInspeccionToAttach);
            }
            inspeccionCollectionNew = attachedInspeccionCollectionNew;
            agencia.setInspeccionCollection(inspeccionCollectionNew);
            agencia = em.merge(agencia);
//            for (Inspeccion inspeccionCollectionNewInspeccion : inspeccionCollectionNew) {
//                if (!inspeccionCollectionOld.contains(inspeccionCollectionNewInspeccion)) {
//                    Agencia oldIdAgenciaOfInspeccionCollectionNewInspeccion = inspeccionCollectionNewInspeccion.getIdAgencia();
//                    inspeccionCollectionNewInspeccion.setIdAgencia(agencia);
//                    inspeccionCollectionNewInspeccion = em.merge(inspeccionCollectionNewInspeccion);
//                    if (oldIdAgenciaOfInspeccionCollectionNewInspeccion != null && !oldIdAgenciaOfInspeccionCollectionNewInspeccion.equals(agencia)) {
//                        oldIdAgenciaOfInspeccionCollectionNewInspeccion.getInspeccionCollection().remove(inspeccionCollectionNewInspeccion);
//                        oldIdAgenciaOfInspeccionCollectionNewInspeccion = em.merge(oldIdAgenciaOfInspeccionCollectionNewInspeccion);
//                    }
//                }
//            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = agencia.getId();
                if (findAgencia(id) == null) {
                    throw new NonexistentEntityException("The agencia with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /**
     * Metodo obsoleto por integracion SICO
     * @param agencia
     * @throws PreexistingEntityException
     * @throws Exception
     * @deprecated
     */
    @Deprecated
    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Agencia agencia;
            try {
                agencia = em.getReference(Agencia.class, id);
                agencia.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The agencia with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Inspeccion> inspeccionCollectionOrphanCheck = agencia.getInspeccionCollection();
            for (Inspeccion inspeccionCollectionOrphanCheckInspeccion : inspeccionCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Agencia (" + agencia + ") cannot be destroyed since the Inspeccion " + inspeccionCollectionOrphanCheckInspeccion + " in its inspeccionCollection field has a non-nullable idAgencia field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(agencia);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Agencia> findAgenciaEntities() {
        return findAgenciaEntities(true, -1, -1);
    }

    public List<Agencia> findAgenciaEntities(int maxResults, int firstResult) {
        return findAgenciaEntities(false, maxResults, firstResult);
    }

    private List<Agencia> findAgenciaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            //Query q = em.createQuery("select object(o) from Agencia as o");
            Query q = em.createNativeQuery("select o.OFICOD id,o.OFIDES nombre from sicod.OFICIN o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            List<Agencia> lista = new ArrayList<Agencia>();

            for (Object agencia : q.getResultList()) {
                Vector vc = (Vector) agencia;
                int id = Integer.valueOf(vc.get(0).toString());
                String nombre = vc.get(1).toString();
                Agencia ag = new Agencia(id, nombre);
                lista.add(ag);
            }
            return lista;
        } finally {
            em.close();
        }
    }

    public Agencia findAgencia(Integer id) {
//        EntityManager em = getEntityManager();
//        try {
//            return em.find(Agencia.class, id);
//        } finally {
//            em.close();
//        }
        EntityManager em = getEntityManager();
        try {
            Vector vec = (Vector) em.createNativeQuery("select o.OFICOD id,o.OFIDES nombre from sicod.OFICIN o where o.OFICOD=?1").setParameter(1, id).getSingleResult();
            Agencia agencia = null;
            if (vec.size() > 0) {
                agencia=new Agencia(Integer.parseInt(vec.get(0).toString()), vec.get(1).toString());
            }
            return agencia;
        } finally {
            em.close();
        }
    }

    public int getAgenciaCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createNativeQuery("select count(*) rows from sicod.OFICIN").getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
}
